/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package yoga.algo.coding;

/**
 *
 * @author Yogev Montekyo
 */
public interface ICoding<T>
{
    public enum InversionTypes
    {
        Linear,
        Mass,
        Continues;
    }

    public enum CrossingTypes
    {
        Single,
        Double;
    }

    public enum OrderingTypes
    {
        FullyRandom,
        NonDisruptive;
    }

    public enum MutationTypes
    {
        Single,
        Multiple;
    }
    public String getDescription();

    void mutate(MutationTypes mutationType, double probability) throws UnsupportedOperationException;

    void crossWith(CrossingTypes crossingType, ICoding<T> coding) throws UnsupportedOperationException, IllegalArgumentException;

    void invert(InversionTypes inversionType) throws UnsupportedOperationException;

    void reorder(OrderingTypes orderingType) throws UnsupportedOperationException;

    void runOperator(ICodingOperator<T> codingOperator) throws Exception;

    ICoding<T> getCopy();    
    
    int getSchemataHash();
            
}
